package com.liouxb.data.structure.stack;

/**
 * 数组实现栈
 *
 * @author liouwb
 */
public class ArrayStackDemo {
    public static void main(String[] args) {

        // 测试
        ArrayStack arrayStack=new ArrayStack(5);
        arrayStack.push(1);
        arrayStack.push(2);
        arrayStack.push(3);
        arrayStack.push(4);
        arrayStack.push(5);

        System.out.println("栈顶弹出："+arrayStack.pop());
        System.out.println("栈顶弹出："+arrayStack.pop());

        arrayStack.showStack();
    }
}

/**
 * 定义栈类
 */
class ArrayStack {

    // 栈的最大容量
    private int maxSize;

    // 数组模拟栈
    private int[] stack;

    // 栈顶 初始化为-1
    private int top = -1;

    /**
     * 构造函数
     *
     * @param maxSize
     */
    ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        // 设置stack大小
        stack = new int[maxSize];
    }

    /**
     * push 入栈操作
     *
     * @param param
     */
    void push(int param) {
        // 判断是否栈满
        if (isFull()) {
            System.out.println("栈已满");
            return;
        }

        top++;
        stack[top] = param;
    }

    /**
     * pop-出栈操作
     *
     * @return
     */
    int pop() {
        // 判断栈是否为空
        if (isEmpty()) {
            throw new RuntimeException("栈为空，没有数据");
        }

        int value = stack[top];
        top--;
        return value;
    }

    /**
     * 遍历显示栈数据
     */
    void showStack() {
        // 判断栈是否为空
        if (isEmpty()) {
            System.out.println(("栈为空，没有数据"));
        }

        // 遍历 需要从栈顶开始
        for (int i = top; i >= 0; i--) {
            System.out.println(stack[i]);
        }
    }

    /**
     * 判断栈是否已满
     *
     * @return
     */
    boolean isFull() {
        return top == maxSize;
    }

    /**
     * 判断栈是否为空
     *
     * @return
     */
    boolean isEmpty() {
        return top == -1;
    }

}
